Fundamental Drawing Algorithms in Computer Graphics - Chapter 4 - [Part 2]
- ده الجزء التاني من الشابتر، وهنركز فيه على Circle Drawing Algorithms.
- هنستعرض أكتر من طريقة لرسم الدواير: من المعادلة المباشرة (Circle Equation) اللي بسيطة بس فيها مشاكل، للخوارزميات الأذكى واللي مش محتاجة كسور أو جذور زي Midpoint و Bresenham.
- هنفهم كمان مفهوم Eight-Way Symmetry اللي بيخلينا نوفر 7 أضعاف الحسابات.
- في الآخر هيكون عندنا مقارنة كاملة بين كل الخوارزميات عشان تعرف تختار الأنسب.
1) Circle Drawing Algorithms
- بما إن الشاشات بتاعتنا Raster displays (عباره عن Grid يعني)، فإحنا محتاجين خوارزميات تقرب الشكل الدائري المتصل ده لمجموعة بيكسلات منفصلة (Discrete pixels) بكفاءة عالية.
- عشان الدائرة شكل متماثل جدا، معظم الخوارزميات بتستغل حاجة اسمها الـ Eight-way symmetry (التماثل الثماني).
- يعني بدل ما نحسب محيط الدائرة كله، إحنا بنحسب تمن واحد بس (1/8 من الدائرة)، وبنعكس النقط دي على باقي الأثمان عشان نقلل الحسابات.
2) Circle Equation Method
Concept of Circle
A circle is specified by its center (xc, yc) and radius r.
-
أبسط طريقة نرسم بيها الدائرة هي إننا نستخدم معادلتها الرياضية. الدائرة في مستوى الإحداثيات بتتعرف بحاجتين:
- نقطة المركز:
(Xc, Yc) - نصف القطر:
r
- نقطة المركز:
-
معادلة الدائرة القياسية:
-
الدائرة هي كل النقط اللي بعدها عن المركز ثابت، والمسافة الثابتة دي اسمها
Radius.
Direct Use of the Circle Equation (The Key Idea)
- الفكرة هنا إننا نمشي خطوة خطوة على محور السينات
بداية من أقصى الشمال لحد أقصى اليمين، وفي كل خطوة نحسب قيمة الصادات اللي تقابلها.- نقطة البداية على الـ
هتبقى: - نقطة النهاية على الـ
هتبقى:
- نقطة البداية على الـ
- بنمشي بـ Unit increments (يعني بنزود الـ
بمقدار 1 في كل خطوة).
عشان نحسب الـ ، بنستخدم المعادلة دي:
- إشارة الـ
دي بتطلعلي قيمتين للـ لكل قيمة (قيمة موجبة ترسم الـ Upper semicircle وقيمة سالبة ترسم الـ Lower semicircle)، عشان كده الدائرة بتترسم كاملة فوق وتحت.
Steps
- السؤال هيديلك المركز
(xc, yc)ونصف القطرr. - بنعمل Loop لكل قيمة
Xمن أولXc - rلحدXc + r. - احسب:
- ارسم النقطتين الناتجين.
- ممكن تستخدم symmetry عشان تقلل الحسابات.
Special Case: Center at Origin
- حالة خاصة وبسيطة جداً، لو كان مركز الدائرة هو نقطة الأصل
(0, 0). ساعتها مش محتاجين نطرحXcولاYc، والمعادلة بتتبسط وتبقى شكلها كده:
Advantages
- سهلة في الفهم والتنفيذ.
Disadvantages
- بتستخدم Floating-point operations (عمليات الكسور العشرية)، ودي تقيلة جداً وبطيئة على البروسيسور.
- ا Not suitable for real-time rendering: مينفعش نستخدمها في ألعاب أو حاجات محتاجة فريمات سريعة لانها بطيئة.
- الحسابات بتاعتها مش Efficient خالص، لأنها بتعتمد على عمليات الضرب (عشان نجيب التربيع) وعملية الـ Square root (الجذر التربيعي) اللي بنحاول نتجنبها على قد ما نقدر في الجرافيكس لأنها بطيئة جداً.
- ا Large gaps: بتعمل فراغات كبيرة في الرسمة لما يكون ميل الخط قريب من الرأسي (ودي هنشرحها بالتفصيل في جزء الـ Output)
مثال من كراسة العملي علي Direct Circle Equation
عايزين نرسم دائرة مركزها
(0,0)ونصف قطرهاr = 5باستخدام معادلة الدائرة الأساسية (Direct Equation).
Step 1: Initial Calculations
- أول حاجة بنعملها إننا بنجهز المعادلة بتاعتنا بناء على المركز ونصف القطر اللي معانا، عشان نستنتج قيمة الـ
y. - المعادلة القياسية للدايرة:
- بما إن المركز بتاعنا هو نقطة الأصل
(0,0)(Special Case)، المعادلة هتتبسط وتبقى:
- حساب الـ y:
- هنودي الـ
yفي طرف لوحدها عشان دي اللي هنحسبها لكل بيكسل:
- هنودي الـ
-
تحديد اتجاه اللوب (Condition):
-
هنعمل Loop على الـ
xبداية من أقصى الشمال ( ) لحد أقصى اليمين ( ). بس عشان التبسيط في الجدول بتاعنا، خلينا نمشي على الربع الأول بس (من0لـ5) ونشوف النقط الموجبة.
Step 2: Iterative Table
-
هنا بقى هنمسك قيم الـ
xمن أول0لحد5، وفي كل مرة نعوض في المعادلة بتاعتنا عشان نجيب قيمة الـy. -
وطبعا عشان دالة الـ Square root بتطلع أرقام عشرية (Floating-point)، لازم نعمل Rounding (نقرب) في الخر عشان نجيب الـ Pixel الصح.
| Step | x (Loop variable) | y (Calculated: 25−x2) | Pixel (after rounding) |
|---|---|---|---|
| 0 | 0 | (0, 5) | |
| 1 | 1 | (1, 5) | |
| 2 | 2 | (2, 5) | |
| 3 | 3 | (3, 4) | |
| 4 | 4 | (4, 3) | |
| 5 | 5 | (5, 0) |
Final Pixels (الربع اليمين اللي فوق):
(0,5), (1,5), (2,5), (3,4), (4,3), (5,0)

Output
-
لما تعمل Run للكود ده وتشوف النتيجة (زي الصورة)، هتلاحظ حاجة غريبة :
- من فوق ومن تحت (Top and bottom edges): الدائرة طالعة ناعمة ومظبوطة (Smooth).
- من اليمين ومن الشمال (Left and right sides): الدائرة فيها فراغات واضحة جداً تحسها متقطعة (Noticeable gaps).
-
ليه ده بيحصل؟
- الفكره في الـ Discrete nature of the pixel grid (طبيعة الشاشة المتقطعة).
- لما بنقرب من أقصى اليمين أو أقصى الشمال، ميل الدائرة (Slope) بيبقى رأسي جدا. ده معناه إن مع كل خطوة صغيرة بنمشيها على الـ
X، قيمة الـYبتتغير برقم كبير جدا. - ولأننا بنمشي بمقدار 1 بيكسل بس على الـ
Xوبنعمل Rounding، الالجورزم بتفوت بيكسلات كتير بالطول ومبترسمهاش، فبيطلع الشكل متقطع ومفيش نقط كفاية تغطي المنطقة دي. - عشان كده، الحل ده مش عملي وبنلجأ لحلول تانية زي الـ Midpoint Circle Algorithm اللي هتحل المشكلة دي تماماً. لو جاهز ندخل عليها، دوس!
3) Eight-Way Symmetry
Eight-way symmetry means a circle can be divided into eight identical octants, and one computed point can generate seven other symmetric points.
- عشان نخلي الخوارزمية بتاعتنا Efficient (سريعة وفعالة)، أول حاجة لازم نلاحظها إن الدائرة اللي مركزها نقطة الأصل
(0, 0)ليها تماثل ثماني الأبعاد. الـ Optimization ده بيوفر علينا عمليات حسابية متكررة ملهاش لازمة (Redundant calculations). - امتى نقول على شكل إنه متماثل؟ لو قدرنا نعمله تحويلات (زي الدوران أو الانعكاس) وفضل شكله زي ما هو متغيرش.
Reflection and Rotation
- الدايرة بقى بالذات ليها Infinite rotational symmetry (تماثل دوراني لا نهائي)، يعني مهما لفيتها بأي زاوية، هتفضل شكلها دائرة.
- يعني إحنا نقدر نقسم الدائرة لـ 8 حتت متساوية (كانها بيتزا 🍕 ) بخطوط بتترسم كل 45 درجة (عند 0°، 45°، 90°، 135°، وهكذا).
- كل حتة من التمانية دول متطابقة تماما مع الباقيين. يعني لو حسبنا ورسمنا تمن واحد بس (1/8)، نقدر نعكسه ونلفه عشان نجيب الـ 7 أتمان الباقيين ببلاش من غير حسابات معقدة.
Symmetric Points
- كل تمن من الـ 8 أتمان بنسميه Octant. لو إحنا حسبنا نقطة واحدة بس اسمها
موجودة على محيط الدائرة في الـ Octant الأول، نقدر نستنتج الـ 7 نقط الباقيين بمجرد إننا نبدل الـ مكان الـ أو نغير الإشارات بتاعتهم (موجب وسالب).
| Symmetry Point | Belongs To | Operation |
|---|---|---|
| Octant 1 | النقطة الأصلية اللي حسبناها | |
| Octant 2 | بدلنا السينات والصادات | |
| Octant 3 | بدلنا وغيرنا إشارة السين | |
| Octant 4 | النقطة الأصلية بس السين سالبة | |
| Octant 5 | النقطة الأصلية بس الاتنين سوالب | |
| Octant 6 | بدلنا والاتنين سوالب | |
| Octant 7 | بدلنا وغيرنا إشارة الصاد | |
| Octant 8 | النقطة الأصلية بس الصاد سالبة |
-
افرض إن الالجورزم بتاعتنا (بعد ما عملت حساباتها المعقدة) طلعت نقطة واحدة بس في التمن الأول وهي
(2, 7)، يعني الـX = 2والـY = 7. -
بدل ما الالجورزم تحسب باقي الدائرة، هتاخد النقطة دي وتطبق عليها الجدول اللي فوق عشان ترسم 8 بيكسلات في نفس اللحظة:
- النقطة في Octant 1 هتبقى:
- النقطة في Octant 2 هتبقى:
- النقطة في Octant 3 هتبقى:
- النقطة في Octant 4 هتبقى:
- النقطة في Octant 5 هتبقى:
- النقطة في Octant 6 هتبقى:
- النقطة في Octant 7 هتبقى:
- النقطة في Octant 8 هتبقى:
- النقطة في Octant 1 هتبقى:
مثال من كراسة العملي علي Eight-Way Symmetry
لو استخدمنا الجورزم وحسبنا اول نقطة في التمن الاول لدائرة مركزها
(0,0)، والنقطة دي(4, 3). عايزين نجيب الـ 7 نقط المتماثلة معاها في باقي الدائرة من غير ما نحسب معادلة الدائرة من أول وجديد.
Step 1: Initial Calculations
أول حاجة بنعملها إننا بنجهز قواعد الانعكاس (Reflection rules) اللي الخوارزمية بتبرمجها. إحنا عارفين إن الدائرة متماثلة في الـ 8 أثمان.
لو النقطة الأساسية هي x = 4 و y = 3:
- عشان نروح للتمن اللي جنبه، بنعكس الـ
xمكان الـy. - عشان نروح للنص الشمال، بنخلي السينات بالسالب.
- عشان نروح للنص اللي تحت، بنخلي الصادات بالسالب.
Step 2: Iterative Table (جدول التماثل الثماني)
هنا بقى الخوارزمية بتمسك النقطة اليتيمة اللي حسبتها (4, 3)، وتطبق عليها الـ 8 قواعد في نفس اللفة عشان تنور 8 بيكسلات مرة واحدة:
| Octant | Symmetry Rule | Calculation (x=4, y=3) | Pixel to Plot |
|---|---|---|---|
| Octant 1 | (x, y) |
(4, 3) |
(4, 3) |
| Octant 2 | (y, x) |
(3, 4) |
(3, 4) |
| Octant 3 | (-y, x) |
(-3, 4) |
(-3, 4) |
| Octant 4 | (-x, y) |
(-4, 3) |
(-4, 3) |
| Octant 5 | (-x, -y) |
(-4, -3) |
(-4, -3) |
| Octant 6 | (-y, -x) |
(-3, -4) |
(-3, -4) |
| Octant 7 | (y, -x) |
(3, -4) |
(3, -4) |
| Octant 8 | (x, -y) |
(4, -3) |
(4, -3) |
Final Pixels:
(4,3), (3,4), (-3,4), (-4,3), (-4,-3), (-3,-4), (3,-4), (4,-3)

4) Midpoint Circle Algorithm
Midpoint Circle Algorithm is an efficient circle drawing algorithm that uses decision parameters to choose the next pixel.
- الالجورزم دي بتعتبر من أكفأ الطرق عشان نرسم بيها دوائر من غير الفراغات اللي شفناها قبل كده. فكرتها إنها بتيجي بين بيكسلين محتملين (واحد أفقي وواحد قطري (بالورب))، وتحسب نقطة الـ Midpoint (نقطة المنتصف) بينهم، وتشوف خط الدائرة الحقيقي أقرب لأنهي بيكسل فيهم عشان تنوره.
Key Idea
- ا Symmetry of Circles: بنستغل الـ 8-way symmetry الي اتكلمنا عنها قبل كده عشان نحسب تمن واحد بس (1/8) ونعكسه 7 مرات.
- ا Decision Parameter: بنستخدم معامل قرار عشان نحدد البيكسل الصح اللي عليه الدور.
- ا Integer Arithmetic: الميزة هنا إننا بنتجنب الـ Floating-point (الكسور) والـ Roots (الجذور) خالص، وكل حساباتنا بتبقى أرقام صحيحة، فبتبقى Computationally efficient (سريعة جداً للبروسيسور).
Steps
- بنبدأ بنقطة المركز
(X0, Y0)ونصف القطرr. - ا Initialize variables:
- بندي قيم ابتدائية للمتغيرات بتاعتنا للتمن الأول:
x = 0
y = r
- بنحسب الـ
Decision Parameter:
decision parameter = 1 - r
- بنعمل Plot لأول نقطة
وبنستخدم الـ Symmetry عشان نرسم الـ 8 نقط المتماثلين. - في كل خطوة، بنحدث الـ Decision parameter وبناءً عليه بنقرر: هل نزود الـ
بس؟ ولا نزود الـ وننقص الـ ؟
مثال من كراسة العملي علي Midpoint Circle Algorithm
عايزين نرسم دائرة مركزها
(0,0)ونصف قطرهاr = 5باستخدام معادلة الدائرة الأساسية (Direct Equation).
Step 1: Initial Calculations
عشان نقدر نعمل جدول trace صغير، خلينا ناخد مثال مصغر من النقط اللي في الكود:
- مركز الدائرة:
(0, 0) - نصف القطر (
):5
تجهيز الخوارزمية:
- بنبدأ من أول نقطة خالص فوق خالص وهي نقطة البداية:
x = 0وy = r = 5. - بنحسب قيمة الـ
decision_paramمن القانون:
- الـ Loop بتاعنا هيفضل شغال طول ما قيمة
x < y.
Step 2: Iterative Table (تتبع الثُمن الأول Octant 1)
- هنا بقى الالجورزم بتشوف قيمة الـ
Pkفي كل لفة عشان تاخد القرار.
| Step | Current (x, y) | decision_param (Pk) | Decision (p >= 0?) | Calculation for next Step | Symmetric points (نقط الدائرة كلها) |
|---|---|---|---|---|---|
| 0 | (0, 5) | p = -4 + 2(1) + 1 = -1 |
(0,5), (0,-5), (5,0), (-5,0), (0,5), (0,-5), (5,0), (-5,0) |
||
| 1 | (1, 5) | p = -1 + 2(2) + 1 = 4 |
(1,5), (-1,5), (1,-5), (-1,-5), (5,1), (-5,1), (5,-1), (-5,-1) |
||
| 2 | (2, 5) | p = 4 + 2(3-4) + 1 = 3 |
(2,5), (-2,5), (2,-5), (-2,-5), (5,2), (-5,2), (5,-2), (-5,-2) |
||
| 3 | (3, 4) | p = 3 + 2(4-3) + 1 = 6 |
(3,4), (-3,4), (3,-4), (-3,-4), (4,3), (-4,3), (4,-3), (-4,-3) |
||
| 4 | (4, 3) | (Loop condition x < y stops here) |
(الـ x بقت 4 والـ y بقت 3، يعني اللوب خلص) |

5) Bresenham's Circle Algorithm
Bresenham's Circle Algorithm Similar to the Midpoint algorithm but uses integer arithmetic exclusively, making it faster and more efficient for hardware implementation.
- اBresenham عمل خوارزمية للدوائر زي ما عمل للخطوط بالظبط. شبه الـ Midpoint بس متظبطة أكتر بحيث إن كل عملياتها تكون جمع وطرح وضرب في أرقام صحيحة بس، وده بيخليها سريعه جدا.
Key Idea
- بتستخدم الـ Symmetry برده عشان تقلل الحسابات.
- بتحسب حاجة اسمها Error term (نفس فكرة الـ Decision parameter) عشان تقرر إحنا هنمشي أفقي (Increment x) ولا قطري (بالورب) (Decrement y).
Steps
- ا Initialize:
x = 0
y = r
- ا
Decision parameterبنرمزله بـ d وبنحسبه كده:
d = 3 - 2r
- ا While loop: طول ما
X <= Y(يعني لسه مخلصناش التمن الأول بتاع الدائرة):
- بنعمل Plot (رسم) للـ 8 نقط المتماثلين حوالين المركز
(Cx, Cy).
- ا If d < 0: ده معناه إننا هنمشي أفقي (Move horizontally):
x = x + 1
- بنحدث معامل القرار:
d = d + 4x + 6
- ا Else: ده معناه إننا هنمشي قطري (Move diagonally):
x = x + 1
y = y - 1
- بنحدث معامل القرار:
d = d + 4(x - y) + 10
مثال من كراسة العملي علي Bresenham's Circle Algorithm
عايزين نرسم دايرة مركزها
(0,0)ونصف قطرهاr = 5باستخدام Bresenham's Circle Algorithm.
Step 1: Initial Calculations
أول حاجة بنجهز المتغيرات بتاعتنا قبل ما ندخل في الـ Loop:
-
نقطة البداية:
و . -
بنحسب قيمة الـ Decision Parameter من قانون Bresenham
d = 3 - 2r:
-
الكود بيرسم أول 8 نقط متماثلة بناءً على النقطة
(0, 5). -
شرط الدوران (Condition): الـ Loop بيفضل شغال طول ما x≤y.
Step 2: Iterative Table ( Octant 1)
- جوه الـ Loop، الخوارزمية بتزود الـ
xبمقدار 1 الأول، وبعدين تبص على إشارة الـdعشان تقرر هتقلل الـyولا لأ، وتحسب الـdالجديدة بناءً على النقط الجديدة.
| Step | Condition (x≤y) | Current d | Decision (d<0?) | New x,y (Pixel) | New d Calculation (using new x,y) |
|---|---|---|---|---|---|
| 0 | Before Loop | - | - | (0, 5) | d=−7 |
| 1 | 0≤5 (True) | −7 | Yes (d<0) | x=1,y=5 (1, 5) | d=−7+4(1)+6=3 |
| 2 | 1≤5 (True) | 3 | No (d≥0) | x=2,y=4 (2, 4) | d=3+4(2−4)+10=5 |
| 3 | 2≤4 (True) | 5 | No (d≥0) | x=3,y=3 (3, 3) | d=5+4(3−3)+10=15 |
| 4 | 3≤3 (True) | 15 | No (d≥0) | x=4,y=2 (4, 2) | d=15+4(4−2)+10=33 |
| 5 | 4≤2 (False) | - | - | - | Loop Stops |
- النقط اللي طلعت من الكود ده للربع الأول هي:
(0,5), (1,5), (2,4), (3,3), (4,2).

6) Parametric Circle Drawing Algorithm
Parametric Circle Drawing Algorithm uses trigonometric functions (
- دي طريقة مختلفه بتعتمد على الدوال المثلثية اللي أخدناها في الرياضة.
- سهلة في الفهم، بس مكلفة حسابيا عشان بتستخدم floating-point operations.
Parametric Equation
- بنستخدم الـ Parametric equation بتاعت الدائرة، اللي بتجيب الإحداثيات عن طريق زاوية اسمها
x = x0 + r cos(θ)
y = y0 + r sin(θ)
- بنعمل Loop ونزود الزاوية
من لحد (يعني لفة كاملة 360 درجة) عشان نولد كل النقط بتاعت الدائرة.
How It Works
- خزن center
(x0, y0)و radiusr. - خلي
θتتحرك من0لـ2π. - لكل قيمة
θ، احسبxوy. - ارسم النقطة الناتجة.
Disadvantage
- استخدام
sin,cos, و floating-point operations بيخليها أبطأ من integer-based algorithms.
مثال من كراسة العملي علي Parametric Circle Drawing Algorithm
عايزين نرسم دايرة مركزها
(0,0)ونصف قطرهاr = 5باستخدام معادلة الدائرة الأساسية (Direct Equation).
Step 1: Initial Calculations
- المعادلة البارامترية (Parametric equation) للدائرة بتعتمد على زاوية الدوران
(ثيتا). القوانين اللي هنعوض فيها هي:
بما إن المركز (0,0)، القوانين هتبقى:
الـ Loop بتاعنا بيلف على الزوايا من
Step 2: Iterative Table (تتبع بعض زوايا الربع الأول)
عشان منطولش الجدول بـ 360 خطوة، خلينا نمسك شوية زوايا مميزة في الربع الأول (من 0 لـ 90 درجة) ونشوف النقط بتتحسب إزاي:
| Step | Angle (θ∘) | Radian (rad) | Calculated x (5⋅cos(θ)) | Calculated y (5⋅sin(θ)) | Pixel (after rounding) |
|---|---|---|---|---|---|
| 1 | (5, 0) | ||||
| 2 | (4, 3) | ||||
| 3 | (4, 4) | ||||
| 4 | (3, 4) | ||||
| 5 | (0, 5) |
- زي ما إنت شايف، الطريقة دي بتجيب النقط بشكل مباشر من غير ما تعتمد على النقطة اللي قبلها، وده اللي بيخليها مختلفة عن الـ Incremental Algorithms زي (DDA أو Bresenham).

7) Quick Comparison Between Drawing Algorithms
| Algorithm | Used For | Main Idea | Strength | Weakness |
|---|---|---|---|---|
| Direct Line Equation | Lines | Use y = mx + c |
سهل جدا | Floating-point و rounding errors |
| DDA | Lines | Increment x و y step by step |
بسيط وأسرع من direct equation | Floating-point و cumulative errors |
| Bresenham Line | Lines | Decision parameter with integers | سريع و efficient | محتاج فهم أكتر للـ decision updates |
| Circle Equation | Circles | Solve circle equation for y |
سهل ومباشر | Square root و gaps عند الأطراف |
| Midpoint Circle | Circles | Decision parameter + symmetry | efficient وبيقلل الحسابات | خطواته أعمق من equation method |
| Bresenham Circle | Circles | Integer decision updates + symmetry | سريع ومناسب للهاردوير | تفاصيل update محتاجة تركيز |
| Parametric Circle | Circles | Use sin و cos |
بسيط رياضيا | Trigonometric functions مكلفة |
8) ملخص الجزء الثاني
اتكلمنا في الجزء ده عن Circle Drawing Algorithms - إزاي الكمبيوتر بيسوي Rasterization ويحول الدوائر الرياضية لـ Pixels على الشاشة.
عرفنا 5 طرق لرسم الدواير:
- Circle Equation Method - سهل ومباشر بس فيه Square Root و Gaps كبيرة
- Eight-Way Symmetry - إن الدائرة ليها 8 Octants متماثلة، فبنحسب نقطة واحدة ونطلع 7 نقط تانية
- Midpoint Circle Algorithm - بيعتمد على Decision Parameter و Symmetry، بيحل مشكلة الـ Gaps
- Bresenham's Circle Algorithm - Integer-Based ومناسب للـ Hardware
- Parametric Circle - بيستخدم sin و cos، سهل فهمه بس أبطأ